地图标注视图

最后更新时间:2019年6月17日

标注视图,即冒泡弹框的信息窗口,一般用于显示标注点的详细信息,如文字描述、图片等。标注视图实现方法如下:

(1) 创建标注:和创建固定点标注的方法完全一致;

(2) 创建地图视图标注的监听器,并设置给地图视图对象。在监听的mapViewViewForAnnotation()回调方法中执行标注视图的创建工作,根据标注对象构建标注视图,并赋予其他样式信息。

1 默认标注视图 Sample详情

默认标注视图具有固定默认的显示模板,只展示标题和描述信息。

//实例化标注对象(参数:名称、描述、位置点、图标)
Annotation annotation = new Annotation("MyAnnotation", "地图标注", position, bmp);
//监听器中有5个回调方法,各有其用
MapViewAnnotationListener annotationListener=new MapViewAnnotationListener() {
	@Override
	public void mapViewClickAnnotation(MapView mapView, Annotation annotation) {
		//点击标注时响应
	}
	@Override
	public void mapViewClickAnnotationView(MapView mapView, AnnotationView annotationView) {
		//点击标注视图时响应
	}
	@Override
	public AnnotationView mapViewViewForAnnotation(MapView mapView, Annotation annotation) {
		//根据标注获取标注视图
		//创建标注视图(标注对象、上下文)
		AnnotationView annotationView = new AnnotationView(annotation,getApplicationContext());
		//说明:由于标注视图是根据标注创建的,所以自动具有标题、描述属性,不用再为其设置文字,但是可为其设置颜色
		//获取标题、描述文本视图,并设置颜色
		annotationView.getCalloutTitleTextView().setTextColor(Color.BLUE);
		annotationView.getCalloutDescriptionTextView().setTextColor(Color.BLACK);
		//设置气泡视图相对于标记边中心的偏移量,默认值:x = 0,y = 0 往右往下偏移取值为正,反之取值为负
		annotationView.setCalloutOffset(new Point(0, 15));
		//设置标记视图显示时是否自动移动到地图视图中心
		annotationView.setPanToMapViewCenter(true);
		return annotationView;    //返回标注视图
	}
	@Override
	public boolean mapViewWillShowAnnotationView(MapView mapView, AnnotationView annotationView) {
		//标注视图即将显示时响应
		return false;    //如果取消显示视图,则可返回true
	}
	@Override
	public boolean mapViewWillHideAnnotationView(MapView mapView, AnnotationView annotationView) {
		//标注视图即将隐藏时响应
		return false;    //如果取消隐藏视图,可返回true,效果为点击地图视图不隐藏
	}
};
//设置标注视图监听器
mapView.setAnnotationListener(annotationListener);

实现效果如下图所示:

默认标注视图.jpg

2 自定义标注视图 Sample详情

用户可以自定义标注视图的显示样式,包括视图的布局、控件的样式等。自定义标注视图,可以在默认标注视图(标题与描述)的基础上增加左、右视图,同样也可以使用自定义布局完全代替原有视图,提供的接口如下所示:

接口 功能
setCalloutView() 设置气泡视图
setCalloutContentView() 设置内容视图
setLeftCalloutAccessoryView() 设置左边的视图
setRightCalloutAccessoryView() 设置右边的视图

自定义标注视图的实现方法与默认的类似,同样需要创建标注、实现标注监听事件。实现方法如下:

(1) 自定义视图xml布局文件(也可采用代码方式创建布局);

(2) 创建标注:和创建固定点标注的方法一样;

(3) 创建标注监听器,并设置给地图对象:在监听的mapViewViewForAnnotation()回调方法中构造标注视图,为视图对象设置xml布局,或者设置代码方式创建的布局。

具体实现代码如下:

//位图:作为标注的图标
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.mipmap.annotation);
//坐标点:作为标注位置
Dot position = new Dot(12735810,3563516);
//实例化标注对象(参数:名称、描述、位置点、图标)
Annotation annotation = new Annotation("MyAnnotation", "地图标注", position, bmp);
//获取地图容器的标注图层,并向其中添加标注
mapView.getAnnotationsOverlay().addAnnotation(annotation);
mapView.refresh();                  //刷新地图

//地图标注监听器
MapViewAnnotationListener annotationListener=new MapViewAnnotationListener() {
	@Override
	public void mapViewClickAnnotation(MapView mapView, Annotation annotation) {
		//点击标注时响应
	}
	@Override
	public void mapViewClickAnnotationView(MapView mapView, AnnotationView annotationView) {
		//点击标注视图时响应
	}
	@Override
	public AnnotationView mapViewViewForAnnotation(MapView mapView, Annotation annotation) {
		//根据xml布局文件实例化View视图对象(布局可以根据需要随意设置)
		View mContents = getLayoutInflater().inflate(R.layout.custom_calloutcontentview, null);
		//创建标注视图(标注对象、上下文)
		AnnotationView annotationView = new AnnotationView(annotation,getApplicationContext());
		//为标注视图设置气泡内容视图
		annotationView.setCalloutContentView(mContents);
		//设置标记视图显示时是否自动移动到地图视图中心
		annotationView.setPanToMapViewCenter(true);
		//返回标注视图
		return annotationView;
	}
	@Override
	public boolean mapViewWillShowAnnotationView(MapView mapView, AnnotationView annotationView) {
		//标注视图即将显示时响应
		return false;    //如果取消显示视图,则可返回true
	}
	@Override
	public boolean mapViewWillHideAnnotationView(MapView mapView, AnnotationView annotationView) {
		//标注视图即将隐藏时响应
		return false;    //如果取消隐藏视图,可返回true,效果为点击地图视图不隐藏
	}
};
//设置标注视图监听器
mapView.setAnnotationListener(annotationListener);

实现效果如下图所示:

自定义标注视图.jpg